0050. Pow(x, n)【中等】
1. 📝 题目描述
实现 pow(x, n),即计算 x 的整数 n 次幂函数(即,
示例 1:
txt
输入:x = 2.00000, n = 10
输出:1024.000001
2
2
示例 2:
txt
输入:x = 2.10000, n = 3
输出:9.261001
2
2
示例 3:
txt
输入:x = 2.00000, n = -2
输出:0.250001
2
2
解释:
提示:
-100.0 < x < 100.0-2^31 <= n <= 2^31-1n是一个整数- 要么
x不为零,要么n > 0。 -10^4 <= x^n <= 10^4
2. 🎯 s.1 - 快速幂(迭代)
c
double myPow(double x, int n) {
long long N = n; // 避免 n = INT_MIN 时取反溢出
if (N < 0) {
x = 1 / x;
N = -N;
}
double result = 1.0;
while (N > 0) {
if (N & 1)
result *= x; // 当前位为 1,累乘当前底数
x *= x; // 底数平方
N >>= 1;
}
return result;
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
js
/**
* @param {number} x
* @param {number} n
* @return {number}
*/
var myPow = function (x, n) {
if (n < 0) {
x = 1 / x
n = -n
}
let result = 1
while (n > 0) {
if (n % 2 === 1) result *= x // 当前位为 1,累乘当前底数
x *= x // 底数平方
n = Math.floor(n / 2)
}
return result
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
py
class Solution:
def myPow(self, x: float, n: int) -> float:
if n < 0:
x = 1 / x
n = -n
result = 1
while n > 0:
if n & 1:
result *= x # 当前位为 1,累乘当前底数
x *= x # 底数平方
n >>= 1
return result1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
- 时间复杂度:
,每次将指数右移一位(除以 2),最多循环 次 - 空间复杂度:
,只使用常数额外空间
算法思路:
- 若
n < 0,将问题转化为 的倒数,即令x = 1/x, n = -n - 利用指数的二进制表示拆分幂运算,例如
- 每轮检查
n的最低位,若为 1 则将当前底数累乘到结果中,然后底数自乘(平方),指数右移一位 - C 语言中使用
long long存储指数,避免 取反溢出